package co.edu.udea.lab.iu.server;

import java.util.ArrayList;
import java.util.List;

import javax.servlet.ServletContext;

import org.springframework.context.ApplicationContext;
import org.springframework.web.context.support.WebApplicationContextUtils;

import co.edu.udea.lab.bl.impl.SolicitudServiceImpl;
import co.edu.udea.lab.dto.Solicitud;
import co.edu.udea.lab.iu.client.SolicitudService;
import co.edu.udea.lab.iu.shared.GWTLaboratorioException;
import co.edu.udea.lab.iu.shared.dto.SolicitudGWT;
import co.edu.udea.lab.util.exception.LabBLException;
import co.edu.udea.lab.util.exception.LabDAOException;

import com.google.gwt.user.server.rpc.RemoteServiceServlet;

public class SolicitudServiceImp extends RemoteServiceServlet implements SolicitudService{

	private static final long serialVersionUID = 1L;

	@Override
	public List<SolicitudGWT> obtenerTodos() throws GWTLaboratorioException {
		
		List<SolicitudGWT> lista = new ArrayList<SolicitudGWT>();
		try{
			ServletContext sc = getServletContext();
			ApplicationContext webApp = WebApplicationContextUtils.getWebApplicationContext(sc);
			
			SolicitudServiceImpl solicitudService = (SolicitudServiceImpl) webApp.getBean("solicitudService");
			
			for(Solicitud solicitud : solicitudService.obtenerSolicitudes("pendiente")){
				
				SolicitudGWT solGwt = new SolicitudGWT();
				
				solGwt.setDetalles(solicitud.getDetalles());
				solGwt.setDispositivo(solicitud.getDispositivo().getDescripcion());
				solGwt.setEstado(solicitud.getEstado());
				solGwt.setFechaPrestamo(solicitud.getFechaPrestamo());
				solGwt.setId(solicitud.getId());
				solGwt.setIdDispositivo(solicitud.getDispositivo().getId());
				solGwt.setIdUsuario(solicitud.getUsuarioPrestamo().getId());
				solGwt.setNombreUsuario(solicitud.getUsuarioPrestamo().getNombreUsuario());
				
				lista.add(solGwt);
			}
		}catch(LabDAOException | LabBLException e){
			throw new GWTLaboratorioException("No se pudo obtener los registros solicitados: " + e.getMessage());
		}
		return lista;
	}

	@Override
	public void cambiarEstado(Integer idSolicitud, String nuevoEstado)
			throws GWTLaboratorioException {
		try{
			ServletContext sc = getServletContext();
			ApplicationContext webApp = WebApplicationContextUtils.getWebApplicationContext(sc);
			
			SolicitudServiceImpl solService  = (SolicitudServiceImpl) webApp.getBean("solicitudService");
			
			solService.cambiarEstado(idSolicitud, nuevoEstado);
			
		}catch(LabDAOException | LabBLException e){
			throw new GWTLaboratorioException("No se pudo cambiar el estado de la solicitud: " + e.getMessage());
		}
		
	}

	@Override
	public void guardar(Integer idUsuario, Integer idDispositivo,
			String fechaPrestamo, String detalles)
			throws GWTLaboratorioException {
		
		try{
			ServletContext sc = getServletContext();
			ApplicationContext webApp = WebApplicationContextUtils.getWebApplicationContext(sc);
			
			SolicitudServiceImpl solService  = (SolicitudServiceImpl) webApp.getBean("solicitudService");
			solService.guardar(idUsuario, idDispositivo, fechaPrestamo, detalles);
			
		}catch(LabDAOException | LabBLException e){
			throw new GWTLaboratorioException("No se pudo guardar la solicitud: " + e.getMessage());
		}
		
	}

	@Override
	public List<SolicitudGWT> obtenerSolicitudes(Integer idUsuario)
			throws GWTLaboratorioException {

		List<SolicitudGWT> lista = new ArrayList<SolicitudGWT>();
		try{
			ServletContext sc = getServletContext();
			ApplicationContext webApp = WebApplicationContextUtils.getWebApplicationContext(sc);
			
			SolicitudServiceImpl solicitudService = (SolicitudServiceImpl) webApp.getBean("solicitudService");
			
			for(Solicitud solicitud : solicitudService.obtenerSolicitudes(idUsuario)){
				
				SolicitudGWT solGwt = new SolicitudGWT();
				
				solGwt.setDetalles(solicitud.getDetalles());
				solGwt.setDispositivo(solicitud.getDispositivo().getDescripcion());
				solGwt.setEstado(solicitud.getEstado());
				solGwt.setFechaPrestamo(solicitud.getFechaPrestamo());
				solGwt.setId(solicitud.getId());
				solGwt.setIdDispositivo(solicitud.getDispositivo().getId());
				solGwt.setIdUsuario(solicitud.getUsuarioPrestamo().getId());
				solGwt.setNombreUsuario(solicitud.getUsuarioPrestamo().getNombreUsuario());
				
				lista.add(solGwt);
			}
		}catch(LabDAOException | LabBLException e){
			throw new GWTLaboratorioException("No se pudo obtener los registros solicitados: " + e.getMessage());
		}
		return lista;
	}
}

